'''
TODO 逻辑控制器
1、概念：可以按照设定的逻辑控制取样器的执行顺序
2、常见的逻辑控制器：
      ① if 控制器
             11、作用：控制下面的测试元素是否运行
             12、操作：测试计划 - 线程组 - 右键（添加逻辑控制器）- 如果(if)控制器
                      不用函数，不勾选 interpret condition / 用函数，勾选
      ② 循环 控制器
             11、作用：通过设置循环次数，来实现循环发送请求
             12、操作：测试计划 - 线程组 - 右键（添加逻辑控制器）- 循环控制器
      ③ ForEach 控制器
             11、作用：一般和用户定义变量/正则表达式提取器一起使用，读取返回结果中一系列相关的变量
                      该控制器下的取样器都会被执行一次或多次，每次读取不同的变量值
             12、操作：测试计划 - 线程组 - 右键（添加逻辑控制器）- ForEach控制器
                          输入变量前缀：固定前缀
                          开始循环字段：后缀数字的最小值-1
                          结束循环字段：后缀数字的最大值
                          输出变量名称：保存的新变量名，用于后续http请求引用
3、案例1 - if控制器：使用 "用户定义的变量" 定义一个变量name，name的值可以是"baidu" 或 "itcast"
                  根据name的变量值实现对应网站的访问
                      测试计划 - 线程组 - 用户定义的变量 （name：baidu/itcast）
                                     - if控制器-常规方式  （ "${name}" == "baidu"，不勾选）
                                            - http请求-baidu  （ip：www.baidu.com)
                                     - if控制器-函数方式
                                                   函数助手：jexl3 - JEXL exp： - 生成：${__jexl3("${name}" == "itcast",)}
                                                   条件：${__jexl3("${name}" == "baidu",)} ，勾选
                                            - http请求-itcast （ip：www.itcast.cn）
   案例2 - 循环控制器：循环访问百度10次
                      测试计划 - 线程组 - 循环控制器 （10）
                                            - http请求-baidu  （ip：www.baidu.com)
   案例31 - ForEach控制器：有一组关键字 [hello, python, 测试]，使用用户定义的变量存储
                        要依次取出关键字，并在百度搜索，例如：https://www.baidu.com/S?wd=hello
                             测试计划 - 线程组 - 用户定义的变量
                                                  name_1   hello
                                                  name_2   python   勾选 数字之间加上下划线      name1、name2（不勾选）
                                                  name_3   测试
                                            - ForEach控制器
                                                  输入变量前缀：name
                                                  开始循环字段：0
                                                  结束循环字段：3
                                                  输出变量名称：kw
                                                 - http请求
                                                      ip   www.baidu.com
                                                      路径  /S?wd=${kw}
   案例32 - ForEach控制器：访问传智播客首页http://www.itcast.cn，获取首页中的地址信息，并全部保存下来
                         要依次取出地址关键字，并在百度搜索，例如：https://www.baidu.com/S?wd=地址
                             测试计划 - 线程组 - http请求 （www.itcast.cn）
                                                 - 正则表达式提取器
                                                        引用名称：name
                                                        正则表达式：<p><span>地址(.*?)</span>(.*?)</p>
                                                        模板：$1$
                                                        匹配数字：-1
                                            - ForEach控制器
                                                  输入变量前缀：area
                                                  开始循环字段：0
                                                  结束循环字段：
                                                  输出变量名称：kw
                                                 - http请求
                                                      ip   www.baidu.com
                                                      路径  /S?wd=${kw}
TODO 定时器
1、同步定时器：
            11、概念：阻塞线程（累积一定的请求），当在规定的时间内达到一定的线程数量，这些线程会在同一时间点一起释放，瞬间产生很大的压力
            12、作用：测试抢购、秒杀或抢红包等高并发的场景使用
            13、操作：测试计划 - 线程组 - http请求 - 右键（添加定时器）-Synchronizing Timer
                        Number of simulated users to group by：模拟用户的数量，即指定同时释放的线程数量 （0，等于设置为线程组中的线程数）
                        timeout in milliseconds：              超时时间，即超时多少毫秒后同时释放指定的线程数  （0，等待线程数达到设置的线程数才释放，否则一直等着）
                                                               不设置（没达到设置的线程数会一直等待）、设置过小（等待时间后没达到设置的线程数，会释放已到达的线程）
2、常数吞吐量定时器：
                11、概念：让JMeter按指定的吞吐量执行，以每分钟为单位
                12、作用：需要按指定的吞吐量发送请求时使用
                13、操作：测试计划 - 线程组 - http请求 - 右键（添加定时器）-Constant Throughput Timer
                           Target throughput：目标吞吐量，每个用户每分钟发送的请求数  （ = QPS * 60 / 线程数 ）
3、固定定时器：
           11、概念：
           12、作用：
           13、操作：测试计划 - 线程组 - http请求 - 右键（添加定时器）-Synchronizing Timer
4、案例1：模拟100个用户同时访问百度首页，统计各种高并发情况下运行情况
             测试计划 - 线程组（线程数100）-http请求（www.baidu.com）-同步定时器（模拟用户数20、超时时间5000）
                    - 添加监听器（察看结果树）
                    - 添加监听器（聚合报告）
   案例2：一个用户以20 QPS（20次/秒）的频率访问百度首页，持续一段时间，统计运行情况
             测试计划 - 线程组（循环次数-永远）-http请求（www.baidu.com）-常数吞吐量定时器（目标吞吐量 1200 = 20 * 60）
   案例3：iHRM系统登录错误3次后，锁定1分钟，1分钟后重新输入正确的用户名密码登录成功
             测试计划 - 线程组 - http请求-错误密码1次（https://ihrm-java.itheima.net/api/sys/login   POST  信息体数据：{mobile: "13800000002", password: "itcast.CN764%..."}）
                            - http请求-错误密码2次（信息体数据：{mobile: "13800000002", password: "itcast.CN764%..."}）
                            - http请求-错误密码3次（信息体数据：{mobile: "13800000002", password: "itcast.CN764%..."}）
                            - http请求-密码正确（信息体数据：{mobile: "13800000002", password: "888itcast.CN764%..."}）
                                 - 固定定时器（60000）    1秒钟=1000毫秒
                    - http信息头管理器（添加：content-type   application/json;charset=UTF-8）

             注意：固定定时器，必须添加到需要等待的http请求的子节点下
                  在http信息头管理器中，修改http请求的头域
'''